package o2o.thridpost.util;

import lombok.extern.slf4j.Slf4j;
import o2o.thridpost.dada.config.DadaConstant;

import java.util.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @author sunyufan deporation@qq.com
 * @date 2021/4/30 9:34
 * @description: CreateSignature
 */
@Slf4j
public class CreateSignature {


    /**
     * MD5方法
     * @param text 明文
     * @return 密文 加密之后的为小写字符串有需求自行转大写
     * @throws Exception
     */
    public static String md5(String text) throws Exception {
        log.info("origin string :" + text);
        //加密后的字符串
        String s = null;
        char[] hexDigits = { // 用来将字节转换成 16 进制表示的字符
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            md.update(text.getBytes("UTF-8"));
            byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数，
            // 用字节表示就是 16 个字节
            char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话，使用两个字符，
            // 所以表示成 16 进制需要 32 个字符
            int k = 0; // 表示转换结果中对应的字符位置
            for (int i = 0; i < 16; i++) { // 从第一个字节开始，对 MD5 的每一个字节
                // 转换成 16 进制字符的转换
                byte byte0 = tmp[i]; // 取第 i 个字节
                str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
                // >>> 为逻辑右移，将符号位一起右移
                str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
            }
            s = new String(str); // 换后的结果转换为字符串

        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        log.info("MD5加密后的字符串为:"+ s.toUpperCase(Locale.ROOT));
        return s;


    }

    /**
     * MD5验证方法
     * @param text 明文
     * @param md5 密文
     * @return true/false
     */
    public static boolean verify(String text, String md5)  {
        //根据传入的密钥进行验证
        try {
            String md5Text = md5(text);
            if(md5Text.equalsIgnoreCase(md5))
            {
                log.info(text +  "通过验证");
                return true;
            }
            return false;
        }catch (Exception e){
            e.printStackTrace();
            log.error(e.toString());
            return false;
        }

    }

    /**
     * 创建达达签名
     * @param doc 需要加密的文档
     * @return
     */
    public static String createDadaSignature(Map<String,Object> doc){
        Collection<String> keySet = doc.keySet();
        List<String> list = new ArrayList<String>(keySet);
        Collections.sort(list);
        StringBuilder signStr = new StringBuilder();

        //接后的字符串首尾加上app_secret秘钥合成签名字符串
        signStr.append(DadaConstant.APP_SECRET);
        for (String key:list) {
            signStr.append(key);
            signStr.append(doc.get(key));
        }
        signStr.append(DadaConstant.APP_SECRET);
        try {
            return md5(signStr.toString()).toUpperCase(Locale.ROOT);
        }catch (Exception e){
            e.printStackTrace();
            log.error(e.toString());
            return "";
        }
    }
}
